/*===============================================
*   文件名称：broadcast.c
*   创 建 者：     
*   创建日期：2024年09月24日
*   描    述：
================================================*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <net/if.h>

int main(int argc, char *argv[])
{ 
    int bfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(-1 == bfd){
        perror("socket");
        return -1;
    }
    //创建或者加入组播
    struct ip_mreqn mreqn;
    mreqn.imr_multiaddr.s_addr = inet_addr("224.2.4.6"); //设置组播地址
    mreqn.imr_address.s_addr   = inet_addr("0");         //加入组播
    mreqn.imr_ifindex          = if_nametoindex("ens33"); //获取网卡索引
#if 0
    //创建组播
    if(-1 == setsockopt(bfd, IPPROTO_IP, IP_MULTICAST_IF, &mreqn, sizeof mreqn)){
        perror("setsockopt");
        return -1;
    }
#else
    if(-1 == setsockopt(bfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreqn, sizeof mreqn)){
        perror("setsockopt");
        return -1;
    }

#endif
    //设置接收方的地址为组播地址
    struct sockaddr_in saddr;
    saddr.sin_family      = AF_INET;
    saddr.sin_port        = htons(6666);
    saddr.sin_addr.s_addr = inet_addr("224.2.4.6");
    socklen_t len = sizeof saddr;

    if(-1 == bind(bfd, (void *)&saddr, len)){
        perror("bind");
        return -1;
    }

    char buf[1024];
    while(1){
        //接收组播的消息
        if(-1 == recvfrom(bfd, buf, 1024, 0, (void *)&saddr, &len)){
            perror("recvfrom");
            return -1;
        }
        printf("Recv:%s", buf);
        printf("> ");
        // fgets(buf, 1024, stdin);
        //向组播发送消息
        // if(-1 == sendto(bfd, buf, 1024, 0, (void *)&saddr, len)){
        //     perror("sendto");
        //     return -1;
        // }
    }
    return 0;
} 
